package dao;

import idao.IImovelDAO;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import entity.Cidade;
import entity.Imovel;
import entity.StatusImovel;
import entity.Pessoa;
import entity.TipoImovel;


public class ImovelDAO implements IImovelDAO {

	private Session session;
	
	@Override
	public Imovel retornaImovel(int id) {
		
		session = ConexaoBanco.getInstance();
		
		Query query = session.createQuery("from Imovel where id = :idImovel");
		query.setParameter("idImovel", id);
		
		Imovel imovel = new Imovel();
		
		for (int i = 0; i < query.list().size(); i++) {
			imovel = (Imovel)query.list().get(i);
		}
		
		return imovel;
	}

	@Override
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public List<Imovel> listaImoveis(Pessoa pessoa) {
		
		session = ConexaoBanco.getInstance();
		
		Query query = session.createQuery("from Imovel where pessoa = :pessoaImovel and " +
										  "status <> :statusImovel");
		query.setParameter("pessoaImovel", pessoa);
		query.setParameter("statusImovel", StatusImovel.REMOVIDO);
		
		List listaImoveis = query.list();
		
		return listaImoveis;
	}

	@Override
	public void cadastra(Imovel imovel) {
		
		session = ConexaoBanco.getInstance();
		
		Transaction tx = session.beginTransaction();
		session.save(imovel);
		tx.commit();
		session.close();
		
	}

	@Override
	public void remove(Imovel imovel) {
	
		session = ConexaoBanco.getInstance();
		
		Transaction tx = session.beginTransaction();
		session.delete(imovel);
		tx.commit();
		session.close();
		
	}
	
	@Override
	public void atualiza(Imovel imovel) {
		
		session = ConexaoBanco.getInstance();
		
		Transaction tx = session.beginTransaction();
		session.update(imovel);
		tx.commit();
		session.close();
		
	}
	
	@Override
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public List<Imovel> buscaImoveis(TipoImovel tipo, Cidade cidade, boolean garagem) {
		
		session = ConexaoBanco.getInstance();
		
		Query query = session.createQuery("from Imovel where tipo = :tipoImovel and " +
				  						  "garagem = :possuiGaragem and endereco.cidade = :cidadeImovel and " + 
										  "status <> :statusImovel");
		
		query.setParameter("tipoImovel", tipo);
		query.setParameter("possuiGaragem", garagem);
		query.setParameter("cidadeImovel", cidade);
		query.setParameter("statusImovel", StatusImovel.REMOVIDO);
		
		List listaImoveis = query.list();
		
		return listaImoveis;
	}
}
